package org.batatasframework.support.database;

import org.batatasframework.support.database.jdbc.ConnectionAccessor;
import org.batatasframework.support.database.sql.TableRuntimeMaster;

import cn.bonoon.kernel.support.IOperator;

/**
 * <pre>
 * 这个接口用于决定查询哪些表，默认情况下查询的表是与定义的表一致。
 * 如果需要查询多个表、或查询不同数据库的表、或者查询不同数据库服务器的表的。
 * 则需要重新实现这个接口，根据当前登录的用户来决定查询哪些表。
 * 
 * 注意：一次查询可能会关联到多张表，所以生成要访问的目标表时，也需要包括完全的关联表，
 * 否则会有异常。
 * 
 * 这里返回的目标表可以有多个(如：分表情况下的连表查询)，目标表的连接有两种方式，
 * 一种同使用sql语句的union连接，一种是分别查询，然后在结果集里合并在一起。
 * 
 * 这个是运行时用于具体确定访问的表或其它一些
 * </pre>
 * @author jackson
 *
 */
public interface IdentifyTableGenerator {
	
	/**  默认情况下，只查询定义的表的数据 */
	IdentifyTableGenerator DEFAULT = new IdentifyTableGenerator(){

		@Override
		public IdentifyTable[] generate(TableRuntimeMaster master, ConnectionAccessor connectionAccessor, IOperator operator) {
			return new IdentifyTable[]{ new IdentifyTable(master, connectionAccessor, operator) };
		}
		
	};
	
	/**
	 * <pre>
	 * 这里返回的是数组，如果超过一个目标表，则会把多个表的结果都放在同一个结果集里；
	 * 
	 * 如果是要使用union连接的，则是需要指定{@link IdentifyTable#getUnion()}字段。
	 * </pre>
	 */
	IdentifyTable[] generate(TableRuntimeMaster master, ConnectionAccessor connectionAccessor, IOperator operator) throws Exception;

}
